﻿/*
给定两个整数，被除数 dividend 和除数 divisor。将两数相除，要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。

示例 1:
输入: dividend = 10, divisor = 3
输出: 3

示例 2:
输入: dividend = 7, divisor = -3
输出: -2

说明:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数，其数值范围是 [−231,  231 − 1]。
本题中，如果除法结果溢出，则返回 231 − 1。
*/

#include "AllInc.h"

class Solution {
public:
	int divide(int dividend, int divisor) 
	{
		if (dividend == INT_MIN && divisor == -1) return INT_MAX;
		long m = labs(dividend), n = labs(divisor), res = 0;
		int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
		if (n == 1) return sign == 1 ? m : -m;
		while (m >= n) {
			long t = n, p = 1;
			while (m >= (t << 1)) {
				t <<= 1;
				p <<= 1;
			}
			res += p;
			m -= t;
		}
		return sign == 1 ? res : -res;
	}
};

//int main()
//{
//	Solution s;
//	auto result = s.divide(10, 3);
//
//	return 0;
//}